<?php

	class InputValidation {
		
		private $errors = array();
		
		//Privata reguljära uttryck
		private $m_e_mail_regexp = "^[_a-zåäö0-9-]+(\.[_a-zåäö0-9-]+)*@[a-zåäö0-9-]+(\.[a-zåäö0-9-]+)*(\.[a-zåäö]{2,7})$^";
		private $m_socialsecurity_regexp = array(		
			"/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])[0-9]{4}$/",				//ÅÅMMDDXXXX 
			"/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])-[0-9]{4}$/",				//ÅÅMMDD-XXXX
			"/^[1-2][0-9]{3}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])[0-9]{4}$/",			//ÅÅÅÅMMDDXXXX
			"/^[1-2][0-9]{3}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])-[0-9]{4}$/");		//ÅÅÅÅMMDD-XXXX
		private $m_date_regexp = array(	
			"/^[0-9]{2}(0[1-9])|(1[0-2])([0-2][0-9])|(3[0-1])$/",						//ÅÅMMDD 
			"/^[1-2][0-9]{3}(0[0-9])|(1[0-2])([0-2][0-9])|(3[0-1])$/",					//ÅÅÅÅMMDD
			"/^[0-9]{2}-(0[0-9])|(1[0-2])-([0-2][0-9])|(3[0-1])$/",						//ÅÅ-MM-DD 
			"/^[1-2][0-9]{3}-(0[1-9])|(1[0-2])-([0-2][0-9])|(3[0-1])$/");				//ÅÅÅÅ-MM-DD 
						
		private $m_password_one_number = "#[0-9]+#";
		private $m_password_one_letter = "#[a-zA-Z]#";		
		private $m_username_validate = "^[0-9a-zA-Z]+$^";
		
		const ERROR_EMAIL = "Ingen giltig emailadress.";
		const ERROR_EMAIL_IS_EMPTY = "Du måste ange en emailadresss";
		const ERROR_PASSWORD_IS_EMPTY = "Du måste ange ett lösenord";
		const ERROR_PASSWORD_TOO_LONG = "För långt lösenord. Max 20 tecken.";
		const ERROR_PASSWORD_TOO_SHORT = "För kort lösenord. Minst 8 tecken.";
		const ERROR_PASSWORD_NUMBER = "Lösenordet måste innehålla minst en siffra.";
		const ERROR_PASSWORD_LETTER = "Lösenordet måste innehålla minst en bokstav.";
		const ERROR_PASSWORD_NO_MATCH = "Lösenorden är inte likadana.";
		const ERROR_USERNAME_IS_EMPTY = "Du måste ange ett användarnamn";
		const ERROR_USERNAME_TOO_SHORT = "Användarnamnet är för kort. Minst 6 tecken";
		const ERROR_USERNAME_TOO_LONG = "Användarnamnet är för långt. Högst 20 tecken";
		const ERROR_USERNAME_VALIDATE = "Användarnamnet får endast innehålla bokstäver och siffror";
										 
		//Jämför inmatad e-mail mot regurjärt utryck
		public function IsValidEmail($email){			
				//Kontrollerar om mailen är inskrivet
				if ($this->IsEmpty($email)){
					$this->errors[] =  InputValidation::ERROR_EMAIL_IS_EMPTY;	
					return false;			
				}		
				return (preg_match($this->m_e_mail_regexp, strtolower($email)) ? TRUE : $this->errors[] = InputValidation::ERROR_EMAIL);					
		}
		public function IsEmpty($value){
			if (empty($value)) {
				return TRUE;
			}
			return FALSE;
		}
		//Jämför inmatat lösenord mot regurjärt utryck
		public function IsValidPassword($password){
				
				//Kontrollerar om lösenordet är inskrivet
				if ($this->IsEmpty($password)){
					$this->errors[] =  InputValidation::ERROR_PASSWORD_IS_EMPTY;	
					return false;			
				}
				
				//Kontrollerar om lösenordet är kortare än 8 tecken
				if (strlen($password) < 6){
					$this->errors[] =  InputValidation::ERROR_PASSWORD_TOO_SHORT;				
				}
				
				//Kontrollerar om lösenordet är längre än 20 tecken
				if (strlen($password) > 20){
					$this->errors[] =  InputValidation::ERROR_PASSWORD_TOO_LONG;	
				}
				
				// Kontrollerar om lösenordet innehåller en siffra
				if (!preg_match($this->m_password_one_number, $password)){
					$this->errors[] =  InputValidation::ERROR_PASSWORD_NUMBER;	
				}
				
				// Kontrollerar om lösenordet innehåller en bokstav
				if (!preg_match($this->m_password_one_letter, $password)){
					$this->errors[] =  InputValidation::ERROR_PASSWORD_LETTER;	
				}			
				
				return TRUE;
		}		
		public function isValidUsername($username){
			
			//Kontrollerar om användarnamnet är inskrivet
			if ($this->IsEmpty($username)){
				$this->errors[] =  InputValidation::ERROR_USERNAME_IS_EMPTY;	
				return false;			
			}
				
			if (strlen($username) < 6) {
				$this->errors[] = InputValidation::ERROR_USERNAME_TOO_SHORT;				
			}		
			
			if (strlen($username) > 20 ){
				$this->errors[] = InputValidation::ERROR_USERNAME_TOO_LONG;
			}
			
			if (!preg_match($this->m_username_validate, $username)){
				$this->errors[] = InputValidation::ERROR_USERNAME_VALIDATE;
			}
			return true;
		}
		public function comparePsswords($password1, $password2){
			if($password1 === $password2){
				return true;
			}		
			$this->errors[] =  InputValidation::ERROR_PASSWORD_NO_MATCH;		
		}
		
		public function checkLength($string, $length) {
			if (strlen($string) > $length) {
				return true; 
			}
			return false;
		}
		
		public function AddError($errorMessage){
			$this->errors[] = $errorMessage;
		}
		public function AddErrors($errorMessages){
			foreach ($errorMessages as $errorMessage) {
				$this->errors[] = $errorMessage;
			}
		}
		public function HasErrors(){
			return count($this->errors) > 0 ? true : false;
		}
		public function GetErrors(){
			return $this->errors;
		}
			
			
			
		/*	
		public function Test (){
			
			//Testar valideringen på mailadressen
			if($this->IsValidEmail("badEmail@wrong,mail,willReturnFalse") == TRUE){
				echo "Testet misslyckades! En felaktig adress har godkänts!";
				return FALSE;
			}
			if($this->IsValidEmail("braMail@awsome.com") === FALSE){
				echo "Testet misslyckades! En riktig e-mailadress har ej godkänts!";
				return FALSE;
			}
			
			//Testar valideringen på personnummer
			if($this->IsValidSocielsecurity("123456789") == TRUE){
				echo "Testet misslyckades! Ett felaktigt personnummer har godkänts!";
				return FALSE;
			}
			if($this->IsValidSocielsecurity("198908296976") == FALSE){
				echo "Testet misslyckades! Ett riktigt personnummer har ej godkänts!";
				return FALSE;
			}
			
			//Testar valideringen på Datum
			if($this->IsValidDate("12345678") == TRUE){
				echo "Testet misslyckades! Ett felaktigt datum har godkänts!";
				return FALSE;
			}
			if($this->IsValidDate("2011-09-14") === FALSE){
				echo "Testet misslyckades! Ett riktigt datum har ej godkänts!";
				return FALSE;
			}

			
			 
			
			$this->IsValidStringWithHTML("<script><h2><h4>Testar h2 taggar</h4></h2></script>");

			$this->IsValidStringWithoutHTML("<h1><script><h4>Test<b>ar</b> h2 taggar</h4></script><h1>");

			//Testar valideringen på lösenord

			// Inga siffror
			if($this->IsValidPassword("gehsabdj") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// för kort
			if($this->IsValidPassword("234asd") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// för långt
			if($this->IsValidPassword("gehsab81623816238162365agvsdhgasvdghi") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// inga bokstäver
			if($this->IsValidPassword("123123123") == TRUE){
				echo "Testet misslyckades! Ett felaktigt lösenord har godkänts!";
				return FALSE;
			}
			
			// Ett godkänt lösenord
			if($this->IsValidPassword("1BraLoN0rd") === FALSE){
				echo "Testet misslyckades! Ett riktigt lösenord har ej godkänts!";
				return FALSE;
			}
			
			//Testar valideringen på användarnamn
			if($this->IsValidNumber("123123hej124") == TRUE){
				echo "Testet misslyckades! Ett felaktigt nummer har godkänts!";
				return FALSE;
			}
			if($this->IsValidNumber("74327235873427") === FALSE){
				echo "Testet misslyckades! Ett riktigt nummer har ej godkänts!";
				return FALSE;
			}
			
			if($this->IsValidNumber(2123.3) === FALSE){
				echo "Testet misslyckades! Ett riktigt nummer har ej godkänts!";
				return FALSE;
			}
			return TRUE;
		}
		 
		 */
	}
	
	
	
?>
